package main

import "fmt"

// 本质是一个指针
type Animal interface {
	Sleep()
	GetColor() string // 获取动物的颜色
	GetType() string  // 获取动物的种类
}

// 具体的类
type Cat struct {
	color string // 猫的颜色
}

func (cat *Cat) Sleep() {
	fmt.Println("Cat is Sleep")
}

func (cat *Cat) GetColor() string {
	return cat.color
}

func (cat *Cat) GetType() string {
	return "Cat"
}

// 具体的类
type Dog struct {
	color string // 狗的颜色
}

func (dog *Dog) Sleep() {
	fmt.Println("Dog is Sleep")
}

func (dog *Dog) GetColor() string {
	return dog.color
}

func (dog *Dog) GetType() string {
	return "Dog"
}

func showAnimal(animal Animal) {
	animal.Sleep()
	fmt.Println("color = ", animal.GetColor())
	fmt.Println("type = ", animal.GetType())
}

func main() {
	//var animal Animal // 接口的数据类型，父类指针
	//animal = &Cat{"Green"}
	//
	//animal.Sleep() // 调用的就是Cat的Sleep()方法，多态的现象
	//
	//animal = &Dog{"Yellow"}
	//
	//animal.Sleep() // 调用的就是Dog的Sleep()方法，多态的现象

	cat := Cat{"Green"}
	dog := Dog{"Yellow"}

	showAnimal(&cat)
	showAnimal(&dog)
}
